package com.koushikdutta.ion;

import ohos.aafwk.ability.Ability;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.ability.AbilitySliceLifecycleExecutor;
import ohos.agp.components.Image;
import ohos.app.Context;

import java.lang.ref.WeakReference;

/**
 * Created by koush on 4/15/14.
 */
public abstract class ContextReference<T> extends WeakReference<T> implements IonContext {
    public ContextReference(T context) {
        super(context);
    }

    abstract static class NormalContextReference<T extends Context> extends ContextReference<T> {
        NormalContextReference(T context) {
            super(context);
        }

        static String isAlive(Context context) {
//            if (context instanceof Service)
//                return ServiceContextReference.isAlive((Service) context);
            if (context instanceof Ability)
                return ActivityContextReference.isAlive((Ability) context);
            return null;
        }

        @Override
        public Context getContext() {
            return get();
        }
    }

//    public static class ServiceContextReference extends NormalContextReference<Ser> {
//        public ServiceContextReference(Service service) {
//            super(service);
//        }
//
//        static String isAlive(Service candidate) {
//            if (candidate == null)
//                return "Service reference null";
//            ActivityManager manager = (ActivityManager) candidate.getSystemService(Context.ACTIVITY_SERVICE);
//            List<ActivityManager.RunningServiceInfo> services = manager.getRunningServices(Integer.MAX_VALUE);
//            if (services == null)
//                return "Could not retrieve services from service manager";
//            for (ActivityManager.RunningServiceInfo service : services) {
//                if (candidate.getClass().getName().equals(service.service.getClassName())) {
//                    return null;
//                }
//            }
//            return "Service stopped";
//        }
//
//        @Override
//        public String isAlive() {
//            return isAlive(get());
//        }
//    }

    public static class ActivityContextReference extends NormalContextReference<Ability> {
        public ActivityContextReference(Ability activity) {
            super(activity);
        }

        static String isAlive(Ability a) {
            if (a == null)
                return "Activity reference null";
            if (a.isTerminating())
                return "Activity finished";
            return null;
        }

        @Override
        public String isAlive() {
            return isAlive(get());
        }
    }

    //    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    public static class FragmentContextReference extends ContextReference<AbilitySlice> {
        public FragmentContextReference(AbilitySlice fragment) {
            super(fragment);
        }

        @Override
        public Context getContext() {
            AbilitySlice fragment = get();
            if (fragment == null)
                return null;
            return fragment.getAbility();
        }

        @Override
        public String isAlive() {
            AbilitySlice fragment = get();
            if (fragment == null)
                return "Fragment reference null";
            String ret = ActivityContextReference.isAlive(fragment.getAbility());
            if (ret != null)
                return ret;
            if (fragment.getState() == AbilitySliceLifecycleExecutor.LifecycleState.INACTIVE)
                return "Fragment detached";
            return null;
        }
    }

    public static class SupportFragmentContextReference extends ContextReference<AbilitySlice> {
        public SupportFragmentContextReference(AbilitySlice fragment) {
            super(fragment);
        }

        @Override
        public Context getContext() {
            AbilitySlice fragment = get();
            if (fragment == null)
                return null;
            return fragment.getAbility();
        }

        @Override
        public String isAlive() {
            AbilitySlice fragment = get();
            if (fragment == null)
                return "Fragment reference null";
            String ret = ActivityContextReference.isAlive(fragment.getAbility());
            if (ret != null)
                return ret;
            if (fragment.getState() == AbilitySliceLifecycleExecutor.LifecycleState.INACTIVE)
                return "Fragment detached";
            return null;
        }
    }

    public static class ImageViewContextReference extends ContextReference<Image> {
        public ImageViewContextReference(Image imageView) {
            super(imageView);
        }

        @Override
        public String isAlive() {
            Image iv = get();
            if (iv == null)
                return "ImageView reference null";
            return NormalContextReference.isAlive(iv.getContext());
        }

        @Override
        public Context getContext() {
            Image iv = get();
            if (iv == null)
                return null;
            return iv.getContext();
        }
    }

    public static ContextReference fromContext(Context context) {
//        if (context instanceof Service)
//            return new ServiceContextReference((Service) context);
        if (context instanceof Ability)
            return new ActivityContextReference((Ability) context);

        return new NormalContextReference<Context>(context) {
            @Override
            public String isAlive() {
                Context context = get();
                if (context == null)
                    return "Context reference null";
                return null;
            }
        };
    }
}
